package com.example.demo.saToken.config;

import cn.dev33.satoken.quick.SaQuickManager;
import cn.dev33.satoken.quick.config.SaQuickConfig;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.log.Log;
import cn.hutool.log.LogFactory;
import com.example.demo.user.entity.User;
import com.example.demo.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

/**
 * @ClassName CustomSaQuickConfig
 * @Description 自定义Sa-Token-Quick-Login配置，使用数据库验证替代硬编码验证
 * @Author System
 * @Date 2025/9/25
 **/
@Component
public class CustomSaQuickConfig implements ApplicationRunner {
    
    private static final Log log = LogFactory.get();
    
    @Autowired
    private UserService userService;
    
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("开始配置Sa-Token-Quick-Login自定义验证逻辑");
        
        // 获取Sa-Token-Quick-Login的配置
        SaQuickConfig config = SaQuickManager.getConfig();
        
        // 直接替换doLoginHandle字段（这是一个public字段）
        config.doLoginHandle = (name, pwd) -> {
            log.info("Sa-Token Quick Login 自定义验证，用户: {}", name);
            
            try {
                // 使用数据库验证用户
                User user = userService.validateUser(name, pwd);
                
                if (user != null) {
                    // 登录成功，使用用户ID作为登录标识
                    StpUtil.login(user.getId());
                    
                    // 将username存储到Session中，供后续使用
                    StpUtil.getSession().set("username", user.getUsername());
                    StpUtil.getSession().set("realName", user.getRealName());
                    
                    log.info("用户登录成功: {}, 用户ID: {}", name, user.getId());
                    return SaResult.data(StpUtil.getTokenInfo());
                } else {
                    log.warn("用户登录失败: {}", name);
                    return SaResult.error("用户名或密码错误");
                }
                
            } catch (Exception e) {
                log.error("登录验证过程发生异常: {}", e.getMessage(), e);
                return SaResult.error("登录验证失败，请稍后重试");
            }
        };
        
        log.info("Sa-Token-Quick-Login 自定义配置加载完成，已替换为数据库验证逻辑");
    }
}
